package com.li.sqlparse.service;

import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.li.sqlparse.entity.ParseItemDto;
import com.li.sqlparse.entity.SetDeclareItemDto;
import com.li.sqlparse.entity.TableColumnLinkDto;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Description：
 * @Author：LiDong
 * @Create：2021/3/14
 * @Version：1.0.0
 */
public interface SqlParseService {

    /**
     * 处理 parseItems
     *
     * @param parseItem
     * @param o
     * @param children
     * @return
     */
    List<ParseItemDto> dealParseItems(ParseItemDto parseItem, String o, List<ParseItemDto> children);

    /**
     * 处理 parseItems 中的关系
     *
     * @param setDeclareItemDtos
     * @param parseItems
     * @param links
     */
    void dealTriggerDependencies(List<SetDeclareItemDto> setDeclareItemDtos, List<ParseItemDto> parseItems, Set<TableColumnLinkDto> links);

    /**
     * 处理 Declare 语句
     *
     * @param statement
     * @param setFromTables
     * @param setSelectColumns
     * @param setDeclareItemDtos
     */
    void dealSqlDeclare(SQLStatement statement, Set<String> setFromTables, Set<String> setSelectColumns, List<SetDeclareItemDto> setDeclareItemDtos);

    /**
     * 处理 set 定义语句
     *
     * @param statement
     * @param setFromTables
     * @param setSelectColumns
     * @param setDeclareItemDtos
     */
    void dealSqlSet(SQLStatement statement, Set<String> setFromTables, Set<String> setSelectColumns, List<SetDeclareItemDto> setDeclareItemDtos);

    /**
     * 处理 Insetr 语句
     *
     * @param statement
     * @param parseItems
     */
    void dealSqlInsert(SQLStatement statement, List<ParseItemDto> parseItems);

    /**
     * 处理 create 语句
     *
     * @param statement
     * @param parseItems
     */
    void dealSqlCreate(SQLStatement statement, List<ParseItemDto> parseItems);

    /**
     * 处理 select into 语句
     *
     * @param statement
     * @param parseItems
     */
    void dealSqlSelectInto(SQLStatement statement, List<ParseItemDto> parseItems);

    /**
     * 处理 UNION 子句
     *
     * @param parseItemDto   parseItemDto
     * @param sqlTableSource SQLTableSource
     */
    void dealSqlUnionQueryTableSource(ParseItemDto parseItemDto, SQLTableSource sqlTableSource);

    /**
     * 处理 JoinTableInfo
     *
     * @param parseItemDto   ParseItem
     * @param sqlTableSource SQLTableSource
     */
    void dealJoinTableInfo(ParseItemDto parseItemDto, SQLTableSource sqlTableSource);

    /**
     * 处理 leftjoin 语句 得到 table 别名
     *
     * @param sqlTableSource SQLTableSource
     * @param tableInfos     相关table和别名的信息
     */
    void dealJoinLeftRight(SQLTableSource sqlTableSource, List<Map<String, String>> tableInfos);

    /**
     * from 为 SqlSubqueryTableSource 处理Children
     *
     * @param item  item
     * @param query SQLSelectQuery
     */
    void dealSqlSubqueryTableSource(ParseItemDto item, SQLSelectQuery query);
}
